package com.huai.demo_test1.xml.reqxmlCompany;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class SocketClient
{
	public static void main(String[] args) throws UnknownHostException, IOException
	{
		SocketClient sc=new SocketClient();
//		sc.send("E082.xml"); // 查流水
//		sc.send("E001.xml"); // 待处理列表查询
		sc.send("E002.xml"); // 出票信息登记
//		sc.send("E003.xml"); // 出票人提示承兑
//		sc.send("E004.xml"); // 承兑签收
//		sc.send("E005.xml"); // 出票人提示收票
//		sc.send("E006.xml"); // 收票签收
//		sc.send("E007.xml"); // 撤销
//		sc.send("E009.xml"); // 背书转让
//		sc.send("E010.xml"); // 背书转让签收
//		sc.send("E011.xml"); // 贴现查询
//		sc.send("E012.xml"); // 贴现申请
//		sc.send("E013.xml"); // 贴现赎回签收
//		sc.send("E014.xml"); // 质押待办列表查询
//		sc.send("E015.xml"); // 质押申请
// 		sc.send("E036.xml"); // 质押签收
// 		sc.send("E035.xml"); // 解除质押
//		sc.send("E016.xml"); // 解除质押签收
//		sc.send("E017.xml"); // 提示付款待办列表查询
//		sc.send("E018.xml"); // 提示付款
//		sc.send("E019.xml"); // 提示付款签收
//		sc.send("E020.xml"); // 保证待办列表查询
//		sc.send("E021.xml"); // 提示保证
//		sc.send("E022.xml"); // 承兑保证签收\出票人保证签收\背书保证签收
//		sc.send("E023.xml"); // 追索待办列表查询
//		sc.send("E024.xml"); // 追索通知
//		sc.send("E026.xml"); // 追索清偿申请
//		sc.send("E027.xml"); // 追索清偿签收
//		sc.send("E028.xml"); // 交易撤销
//		sc.send("E030.xml"); // 电子票据查询
//		sc.send("E040.xml"); // 电子票据查询
//		sc.send("E031.xml"); // 票据正面查询
//		sc.send("E032.xml"); // 票据背面查询
//		sc.send("E081.xml"); // 节假日数据同步
//		sc.send("E091.xml"); // 票据信息维护申请（不得转让标记）查询
//		sc.send("E092.xml"); // 不得转让撤销申请
//		sc.send("E093.xml"); // 不可转让撤销申请签收
//		sc.send("E101.xml"); // 票据查验申请查询
//		sc.send("E102.xml"); // 票据查验申请
//		sc.send("E103.xml"); // 查验票据历史行为信息
//		sc.send("E114.xml"); // 支付信用查询
//		sc.send("E115.xml"); // 支付信用申请
//		sc.send("E116.xml"); // 支付信用结果查询
//		sc.send("E117.xml"); // 存托申请
//		sc.send("E118.xml"); // 存托申请查询
//				sc.send("E119.xml"); // 全市机构查询

//		sc.send("E124.xml"); // 附件查询
//		sc.send("E091.xml"); //
//		sc.send("E125.xml"); // 客户信息报备（签约）
//		sc.send("E126.xml"); // 客户账户信息维护
//		sc.send("E127.xml"); // 报备客户信息查询
//		sc.send("E128.xml"); // 报备客户账户信息查询
//		sc.send("E129.xml"); // 客户信息注销（解约）
//		sc.send("E130.xml"); // 对手开户行是否开通新一代查询

//		sc.send("CIS06.xml"); // 承兑贴现业务票据锁定解锁
//		sc.send("CIS05.xml"); // 贴现挑票
//		sc.send("CIS07.xml"); // 贴现放行
//		sc.send("CIS21.xml"); // 承兑业务放行

	}

	private void send(String requestFileName) throws IOException
	{
//		String ip="localhost";
		String ip="10.100.32.13";
		int port=8080;
//		int port=30000;
//		String basePath="test/request/";

		String basePath="/Users/huaixiaohuan/Documents/projecthuai/demo20211229/src/main/java/com/huai/demo_test1/xml/";
//		String basePath="/Users/huaixiaohuan/Documents/projecthuai/demo20211229/src/main/java/com/huai/demo_test1/testSolution/";
//		String basePath="/Users/huaixiaohuan/Documents/projecthuai/demo20211229/src/main/java/com/huai/demo_test1/reqxmlCompany/";
//		String basePath="/Users/huaixiaohuan/Documents/projecthuai/demo20211229/src/main/java/com/huai/demo_test1/cepstestCompany/";
		int length=8;	//长度位数
		String fullPath=basePath+requestFileName;
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fullPath)));
		String line=null;
		StringBuilder requestXml=new StringBuilder();
			while((line=br.readLine())!=null)
			{
				if (line.contains("<seqNb>")) {
					LocalDateTime localDateTime = LocalDateTime.now();
					DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
					line = line.substring(0,line.indexOf("<seqNb>")) + "<seqNb>" + localDateTime.format(dateTimeFormatter) +"</seqNb>";
				}
				requestXml.append(line).append("\n");
			}
		br.close();
		int sendDatalength=requestXml.toString().getBytes(StandardCharsets.UTF_8).length;
		String lengthStr=packString(sendDatalength+"","N",length);
		requestXml.insert(0, lengthStr);
		System.out.println("请求报文-->"+requestXml);

		Socket s=new Socket(ip,port);
		OutputStream out = s.getOutputStream();
		InputStream in = s.getInputStream();
		out.write(requestXml.toString().getBytes(StandardCharsets.UTF_8));
		out.flush();

		byte[] receLengthByte = new byte[length];
		in.read(receLengthByte, 0, length);
		int receDatalength = Integer.parseInt(new String(receLengthByte));
		byte[] receData = new byte[receDatalength];
		in.read(receData, 0, receDatalength);
		String receMsg = new String(receData, StandardCharsets.UTF_8);
		receMsg=receMsg.replaceAll("><", ">\n<");
		System.out.println("响应报文-->"+receMsg);

		out.close();
		in.close();
		s.close();
	}

	/**
	 *
	 * @param value
	 *            字段值
	 * @param type
	 *            字段类型
	 * @param maxLength
	 *            最大长度
	 * @return
	 */
	private static String packString(String value, String type, int maxLength)
	{
		StringBuilder result = new StringBuilder();
		if (value == null)
		{
			value = "";
		}
		if ("N".equals(type)) // 数字栏
		{
			result.append(getString("0", maxLength - value.length())).append(value);
		}
		else if ("AN".equals(type)) // 字符数字栏
		{
			result.append(value).append(getString(" ", maxLength - value.length()));
		}
		else if ("A".equals(type)) // 字符栏
		{
			result.append(value).append(getString(" ", maxLength - value.length()));
		}

		return result.toString();
	}
	
	private static String getString(String value, int count)
	{
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < count; i++)
		{
			result.append(value);
		}
		return result.toString();
	}
}
